package top.gangster.lunan.contractservice.controller;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import top.gangster.lunan.contractservice.entity.Contract;
import top.gangster.lunan.contractservice.entity.ContractField;
import top.gangster.lunan.contractservice.feign.OSSClient;
import top.gangster.lunan.contractservice.service.ContractService;
import top.gangster.lunan.resolver.FileNameResolver;
import top.gangster.lunan.result.Result;

/**
 * <p>
 * 合同的所有信息 前端控制器
 * </p>
 *
 * @author kid
 * @since 2021-11-11
 */
@RestController
@RequestMapping("/contractservice/contract")
public class ContractController {
	@Autowired
	ContractService contractService;

	@Resource
	OSSClient ossClient;

	/**
	 * 获取所有的合同文件
	 * @return 所有合同文件
	 */
	@GetMapping
	public Result getAllContract() {
		List<Contract> list = contractService.list(null);
		return Result.ok().data("contractList",list);
	}


	/**
	 * 获取指定id的合同文件
	 * @param id 合同id
	 * @return 指定合同文件
	 */
	@GetMapping("/{id}")
	public Result getContract(@PathVariable String id) {
		Contract contract = contractService.getContract(id);
		return Result.ok().data("contract",contract);
	}

	/**
	 * 根据合同文件id返回其所有字段
	 * @param id 合同文件id
	 * @return 所有字段
	 */
	@GetMapping("/fields/{id}")
	public Result getFieldsOfContract(@PathVariable String id) {
		List<ContractField> fields = contractService.getFieldsOfContractId(id);
		return Result.ok().data("fields",fields);
	}

	/**
	 * 分页模糊查询
	 * @param current 当前页
	 * @param limit 每页大小
	 * @return 分页查询结果
	 */
	@GetMapping("/{current}/{limit}")
	public Result getContract(@PathVariable Long current,@PathVariable Long limit,@RequestParam(required = false) String name) {
		Page<Contract> page = contractService.getContract(current, limit, name);
		return Result.ok().data("page",page);
	}

	/**
	 * 根据合同类型id查询所有合同
	 * @param typeId 合同类型id
	 * @return 所有该类型的合同
	 */
	@GetMapping("/type/{typeId}")
	public Result getContractByType(@PathVariable Integer typeId) {
		List<Contract> contractList = contractService.getContractByTypeId(typeId);
		return Result.ok().data("contractList",contractList);
	}

	/**
	 * 根据合同类型id分页查询所有合同
	 * @param typeId 合同类型
	 * @param current 当前页
	 * @param limit 页大小
	 * @return 分页查询结果
	 */
	@GetMapping("/type/{typeId}/{current}/{limit}")
	public Result getContractByType(@PathVariable Integer typeId ,@PathVariable Long current,@PathVariable Long limit) {
		Page<Contract> page = contractService.getContractByTypeId(typeId, current, limit);
		return Result.ok().data("page",page);
	}

	/**
	 * 根据合同状态查询所有合同
	 * @param stateId 合同状态id
	 * @return 当前状态所有合同
	 */
	@GetMapping("/state/{stateId}")
	public Result getContractByState(@PathVariable Integer stateId) {
		List<Contract> contractList = contractService.getContractByStateId(stateId);
		return Result.ok().data("contractList",contractList);
	}

	/**
	 * 根据合同状态分页查询所有合同
	 * @param stateId 合同状态id
	 * @param current 当前页
	 * @param limit 页大小
	 * @return 分页查询结果
	 */
	@GetMapping("/state/{stateId}/{current}/{limit}")
	public Result getContractByState(@PathVariable Integer stateId,@PathVariable Long current,@PathVariable Long limit) {
		Page<Contract> page = contractService
				.getContractByStateId(stateId, current, limit);
		return Result.ok().data("page",page);
	}

	/**
	 * <h2>该方法应在OSS保存合同文件之后执行</h2>
	 * 保存合同文件至数据库
	 * @param contract 包含合同字段的合同文件
	 * @return Result
	 */
	@PostMapping("/save")
	public Result saveContract(@RequestBody Contract contract) {
		// 获取合同文件属性
		String id = contract.getId();
		List<ContractField> fields = contract.getFieldList();

		// 保存合同字段至数据库
		contractService.saveFields(id,fields);

		// 保存合同文件至数据库
		contractService.save(contract);

		return Result.ok();
	}

	/**
	 * 根据合同id更新合同文件
	 * @param contract 合同文件
	 * @return Result
	 */
	@PutMapping
	public Result updateContract(@RequestBody Contract contract) {
		boolean b = contractService.updateContract(contract);
		if (b) {
			return Result.ok().message("成功更新合同文件");
		}
		return Result.error().message("更新合同文件失败");
	}

	/**
	 * 根据合同文件id删除合同文件及其所有字段，以及OSS中的合同文件
	 * @param id 合同文件id
	 * @return Result
	 */
	@DeleteMapping("/{id}")
	public Result deleteContract(@PathVariable String id) {
		// 从OSS中删除合同文件
		Contract contract = contractService.getById(id);
		if (contract == null) {
			return Result.error().message("不存在id为"+ id + "的合同文件");
		}

		// 获取文件后缀
		String suffix = FileNameResolver.getFileSuffix(contract.getName());

		// 合同文件是以 fileId + suffix 的形式命名的
		ossClient.deleteContract(id + suffix);

		// 删除合同文件的所有字段
		contractService.removeFieldsByContractId(id);

		// 删除合同文件
		contractService.removeById(id);

		return Result.ok().message("成功删除id为"+ id + "的合同文件");
	}
}

